那昨天後來自己在玩寫好的腳本時,發現了會有邏輯上的錯誤,導致物件撞牆時,會不斷產生抖動,而之後也去Unity官網找了一下,有沒有適合改善這個問題的程式在,後來找到一個。通過更改物件"rigidbody.velocity"的數值來移動物件。他是通過改變"rigidbody"的向量速度,來達到物件移動的效果,這樣就不會產生物件穿到牆裡,又被排出的抖動畫面了。
Unity官方提供的rigidbody.velocity描述:
https://docs.unity3d.com/ScriptReference/Rigidbody-velocity.html
那一樣我直接用Unity提供的範例程式,融到本來的程式碼裡試試。
那包含跳躍在內,所有的移動都變得更加滑順,但因為我們改變的是速度,所以當按鍵放開,物件還是會往前滑行一小段距離。物件的移動是滑出去之後,慢慢減速的。所以還有地方需要再更改。
那因為我們的程式是改變速度,當我們放開按鍵時,速度是慢慢減少的,為了讓物件馬上停下,所以在放開按鍵的同時,也將速度重製為零就好了。
更改完之後,移動就照著預想的行動了,不過跳躍部分還是有點問題,當跳躍起來移動時,物體就會卡在半空中,那麼這又是要另外解決的問題。那這是因為我們速度的程式是用new Vector3去設定速度的,當我們移動某個方向時,其他方向的速度都使其歸0,那麼只要指定特定軸的速度,我想應該就可以了。
實際弄出來之後,是可以正常執行了,而跳躍為了避免連跳,也多了一個判斷,物件高度必須低於1,才能跳起來。
那最後完整的程式碼大概是這樣:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Move : MonoBehaviour
{
public Rigidbody rb;
private Vector3 jpdown;
void Start()
{
rb = GetComponent<Rigidbody>();
}
void Update()
{
if (Input.GetKey(KeyCode.UpArrow))
{
jpdown.z = 5;
}
if (Input.GetKey(KeyCode.DownArrow))
{
jpdown.z = -5;
}
if (Input.GetKeyUp(KeyCode.DownArrow) || Input.GetKeyUp(KeyCode.UpArrow))
{
jpdown.z = 0;
}
if (Input.GetKey(KeyCode.RightArrow))
{
jpdown.x = 5;
}
if (Input.GetKey(KeyCode.LeftArrow))
{
jpdown.x = -5;
}
if (Input.GetKeyUp(KeyCode.LeftArrow)|| Input.GetKeyUp(KeyCode.RightArrow))
{
jpdown.x = 0;
}
if (Input.GetKeyDown(KeyCode.Space) && transform.localPosition.y <= 1)
{
rb.AddForce(Vector3.up * 350);
}
jpdown.y = rb.velocity.y;
rb.velocity = jpdown;
}
}
那麼30天挑戰雖然結束了,但Unity的學習不會結束,謝謝陪了我30天的各位!ε(*´・∀・`)з゙
之後有緣再見吧!!!